# 元类是所有类的基础类 关键字type, 能够函数式创建一个类
# type(name, bases, dict)，接收三个参数
#
# 第一个参数name是指要创建类的名称
# 第二个参数bases是指需要继承父类的元组
# 第三个参数dict是类的属性
# 元类能够实现在类继承的时候，读取改类的属性并且设置该类的属性
# 也可以通过通过继承metaclass=type来进行书写
# 实现功能比如，在ORM中，当你继承了ORM的Model之后，这个模型在创建表的时候就能够自动发现并创建

class ModelMeta(type):
    def __new__(cls, name, bases, attrs):
        model_class = super().__new__(cls, name, bases, attrs)

        if 'tablename' not in attrs:
            setattr(model_class, "tablename", name.lower())

        return model_class


class Modal(metaclass=ModelMeta):
    pass


class User(Modal):
    pass

if __name__ == '__main__':
    print(User.tablename)